Шаг 4. Отменяем коммит

Команда git revert отменяет указанный коммит. С ней нам не нужно указывать прошлый коммит, чтобы отменить тот, на который показывает HEAD или указатель ветки. Всё, что нужно сделать — указать коммит с изменениями, которые мы хотим отменить.

Плюс этой команды: коммиты, которые идут после указанного, не отменяются.

Сначала выведем два последних коммита, для этого воспользуемся командой git log --oneline -2.

Введена команда git log --oneline -2
Введена команда git log --oneline -2

Допустим, мы хотим отменить коммит с хэшем 195dfb0 — он добавляет шапку. Мы специально его выбрали, чтобы показать, что вышестоящий коммит не будет отменён.

Теперь введём команду git revert 195dfb0.

Введена команда git revert 195dfb0
Введена команда git revert 195dfb0

Появился конфликт, потому что в элементе <header> содержится не только заголовок, но и неупорядоченный список. Git попытался наложить входящий элемент <h1>, но у него ничего не вышло.

Решим конфликт вручную, потому что нам нужно удалить только элемент <header>, а не всё, что в нём находится.

Получится следующая картина:

Красная стрелка указывает на изменённую часть
Красная стрелка указывает на изменённую часть

Также не забываем сохранять файл после любых изменений.

У нас остался элемент <h1> и неупорядоченный список <ul>, который идёт следом. Теперь данное изменение нужно добавить в индекс с помощью команды git add --all.

Введена команда git add --all
Введена команда git add --all

Продолжим отмену коммита с помощью команды git revert --continue.

Введена команда git revert --continue
Введена команда git revert --continue

После ввода команды откроется файл COMMIT_EDITMSG, в котором можно отредактировать текст коммита. Дело в том, что при использовании команды git revert создаётся новый коммит, в котором содержатся соответствующие изменения.

Но данный коммит можно и не создавать, для этого нужно указать после хэша опцию --no-commit, сокращённо -n. Тогда у нас получится избежать коммита, который предлагает нам Git, но полностью от этого уйти не получится. Нам вновь предстоит сделать выбор: или мы сами создаём фиксацию, или отменяем все изменения.

Мы не будем редактировать коммит, предложенный Git. Просто сохраним файл и закроем его.

Затем перейдём в Git Bash и увидим сообщение с краткой информацией о новом коммите.

Красная стрелка указывает на новый коммит, сделанный после отмены коммита
Красная стрелка указывает на новый коммит, сделанный после отмены коммита

Давайте выведем четыре последних коммита: убедимся, что вышестоящий не отменён, и посмотрим на новый коммит. Для этого введём команду git log --oneline -4.

Введена команда git log --oneline -4
Введена команда git log --oneline -4

Все старые коммиты остались, а также появился новый, на который сейчас показывает указатель ветки main.

Команда git revert может отменять и целую группу коммитов. Для этого нужно воспользоваться последовательностью коммитов: хеш-первого-коммита..хеш-второго-коммита. Детальная запись выглядит так: git revert 0d5c..67ae. Однако чем больше коммитов вы «захватите» в эту группу, тем выше вероятность столкнуться со сложным конфликтом, который придётся долго решать.